package redis.clients.jedis;

import java.time.Duration;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;

public class JedisPoolConfig extends GenericObjectPoolConfig<Jedis> {

  public JedisPoolConfig() {
    // defaults to make your life with connection pool easier :)

    /**
     * 当空闲连接超过一定时间后，测试该连接是否仍然有效。如果有效，则返回该连接；如果无效或不存在，则创建一个新的连接。
     *
     * 具体来说，当设置为 true 时，表示在空闲连接超过一定时间后，
     * 会进行有效性检查。如果空闲连接仍然有效，那么就会返回该连接；
     * 否则，会创建一个新的连接。这样可以确保连接池中的连接始终是有效的，避免因为无效连接导致的资源浪费和性能下降。
     */
    setTestWhileIdle(true);

    /**
     * 当空闲连接的最小空闲时间超过该值时，该连接可以被驱逐出连接池
     *
     * 具体来说，当设置为一个非负整数时，表示在空闲连接的最小空闲时间超过该值后，
     * 该连接可以被驱逐出连接池。这样可以确保连接池中的连接始终是活跃的，
     * 避免因为长时间空闲而导致的性能下降和资源浪费。
     */
    setMinEvictableIdleTime(Duration.ofMillis(60000));

    /**
     * 指定连接池中用于检查空闲连接是否有效并驱逐无效连接的时间间隔。
     *
     * 当设置为一个非负整数时，表示在每次检查空闲连接的有效性之前，
     * 需要等待该时间间隔后再进行下一次检查。这样可以确保连接池中的连接始终是有效的，
     * 避免因为无效连接导致的资源浪费和性能下降。
     */
    setTimeBetweenEvictionRuns(Duration.ofMillis(30000));


    /**
     * 指定每次检查空闲连接的有效性时，需要进行多少次测试。
     *
     * 当设置为一个非负整数时，表示在每次检查空闲连接的有效性之前，需要对该连接进行该次数的测试。
     * 这样可以确保连接池中的连接始终是有效的，避免因为无效连接导致的资源浪费和性能下降。
     */
    setNumTestsPerEvictionRun(-1);
  }
}
